﻿//------------------------------------------------------------------------------
// La classe Carte
//------------------------------------------------------------------------------
using Wrapper;

namespace Package_Carte
{
    using Package_Civilisation;
    using Package_Civilisation.Package_Unite;
    using Package_Jeu;
	using Package_Case;
	using System;
	using System.Collections.Generic;
	using System.Linq;
	using System.Text;

    [Serializable()]
	public class Carte : ICarte
	{
		protected Case[,] _plateauCase; // Un tableau de Case
        protected List<Unite>[,] _plateauUnite; // Un tableau d'unité
        protected Ville[,] _plateauVille;// Un tableau de Ville
        protected int _taille;

		public virtual Case Case
		{
			get;
			set;
		}
        public int taille
        {
            get { return _taille; }
        }
		public virtual FabriqueCases FabriqueCases
		{
			get;
			set;
		}

        public Case getCase(int x, int y)
        {
            return _plateauCase[x,y];
        }
        
        public List<Unite> getUnite(int x, int y)
        {
            return _plateauUnite[x,y];
        }
        public Ville getVille(int x, int y)
        {
            return _plateauVille[x, y];
        }
        public List<Unite> getUniteEnnemi(int x, int y, Joueur ami){
            List<Unite> temp = getUnite(x,y);
            List<Unite> retour = new List<Unite>(); ;
            foreach (Unite u in temp)
            {
                if (u.civilisation.joueur != ami) retour.Add(u);
            }
            return retour;
        }
        public List<Unite> getUniteAmi(int x, int y, Joueur ami)
        {
            List<Unite> temp = getUnite(x, y);
            List<Unite> retour = new List<Unite>(); ;
            foreach (Unite u in temp)
            {
                if (u.civilisation.joueur == ami) retour.Add(u);
            }
            return retour;
        }

        public void addUnite(int x, int y, Unite u)
        {
            _plateauUnite[x, y].Add(u);
        }


        unsafe void creerCarte(int taille)
        {
            
            WrapperAlgo w = new WrapperAlgo();
            string type ="";
            string ressourceSpeciale ="";
            int*** carte = w.creerCarte(taille);
            for (int i = 0; i < _taille; i++)
            {
                for (int j = 0; j < _taille; j++)
                {
                    if (carte[i][j][0] == 0) type = "Montagne";
                    if (carte[i][j][0] == 1) type = "Plaine";
                    if (carte[i][j][0] == 2) type = "Desert";
                    if (carte[i][j][1] == 0) ressourceSpeciale = "";
                    if (carte[i][j][1] == 1) ressourceSpeciale = "Fer";
                    if (carte[i][j][1] == 2) ressourceSpeciale = "Fruit";
                    FabriqueCases f = FabriqueCases.getInstance();
                    Case c = f.creerCase(type, ressourceSpeciale);
                    _plateauCase[i, j] = c;
                }
            }
        }

        
        public Carte(int taille)
        {
            _taille = taille;
            _plateauVille = new Ville[_taille, _taille];
            _plateauUnite = new List<Unite>[_taille, _taille];

            _plateauCase = new Case[_taille, _taille];
            creerCarte(_taille);
            
            for (int i = 0; i < _taille; i++)
            {
                for (int j = 0; j < _taille; j++)
                {
             //       _plateauCase[i,j] = new Plaine();
                    _plateauVille[i,j] = null;
                    _plateauUnite[i,j] = new List<Unite>();
                }
            }
           
            
        }

        ~Carte()
		{
		}


        public void removeUnite(int x, int y, Unite unite)
        {
            _plateauUnite[x, y].Remove(unite);
        }

        public void removeVille(int x, int y, Ville ville)
        {
            _plateauVille[x, y] = null;
        }

        public void addVille(int x, int y, Ville ville)
        {
            _plateauVille[x, y] = ville;
        }

        public bool isSafe(int x, int y, Joueur joueur)
        {
            return !getUniteEnnemi(x, y, joueur).Any<Unite>(); 
        }
        public System.Drawing.Point getRandomPosition(Civilisation civilisation)
        {
            Random generateur = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
            int posX = generateur.Next(0, _taille-1);
            int posY = generateur.Next(0, _taille-1);


            return new System.Drawing.Point(posX, posY);
        }
        public void deplacerUnite(int x1, int y1, int x2, int y2, Unite u)
        {
            if (getUnite(x1, y1).Contains(u))
            {
                removeUnite(x1, y1, u);
                addUnite(x2, y2, u);
            }
        }
    }
}

